import 'dart:math';
import 'package:dio/dio.dart' as dio;
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import '../services/dio_service.dart';
import '../services/user_service.dart';
import '../routers/index.dart';
import '../models/index.dart';

/// 用户API调用类
/// 
/// 负责所有用户相关的API调用
/// 使用DioService进行网络请求，返回标准化的ApiResponse
/// 这是一个工具类，不是服务类
class UserApi {
  // 🔗 API路径常量
  static const String loginPath = '/auth/login';
  static const String loginNativePath = '/api/login/login'; // Android原生登录接口
  static const String phoneCodeLoginPath = '/api/login/phoneCodeLogin'; // 验证码登录
  static const String getSMSCodePath = '/api/login/getSMSCode'; // 获取验证码
  static const String getMyHeadInfoPath = '/api/user/getMyHeadInfo'; // 获取我的页面头部信息
  static const String logoutPath = '/auth/logout';
  static const String refreshTokenPath = '/auth/refresh';
  // ⚠️ 以下若依框架接口已废弃，Android原生项目不使用
  // static const String userProfilePath = '/system/user/profile';
  // static const String uploadAvatarPath = '/system/user/profile/avatar';
  // static const String updateProfilePath = '/system/user/profile';
  
  // 📡 网络服务实例
  static DioService get _dioService => Get.find<DioService>();
  
  /// 处理token失效
  /// 
  /// 清除本地token并跳转到登录页
  static void _handleTokenExpired() {
    debugPrint('🔐 处理token失效流程');
    
    try {
      // 获取UserService并清除token
      final userService = Get.find<UserService>();
      userService.logout(); // 使用logout方法清除认证数据
      
      debugPrint('✅ 已清除本地token');
      
      // 延迟跳转，确保当前请求完成
      Future.delayed(const Duration(milliseconds: 500), () {
        debugPrint('🔀 跳转到登录页');
        Get.offAllNamed(RouteNames.systemLogin);
      });
    } catch (e) {
      debugPrint('❌ 处理token失效失败: $e');
    }
  }
  
  /// 用户登录API
  /// 
  /// [request] 登录请求参数
  /// 返回包含TokenModel的ApiResponse
  static Future<ApiResponse<TokenModel>> login(LoginReq request) async {
    // 使用DioService发送请求（DioService已配置了baseUrl）
    // 错误处理由DioService统一处理，不在此处重复处理
    final response = await _dioService.post(
      loginPath,
      data: request.toJson(),
    );
    
    // 解析响应数据
    if (response.data != null && response.data is Map<String, dynamic>) {
      final responseData = response.data as Map<String, dynamic>;
      
      // 使用ApiResponse.fromJson解析，并提供TokenModel的fromJson方法
      return ApiResponse<TokenModel>.fromJson(
        responseData,
        fromJsonT: TokenModel.fromJson,
      );
    } else {
      return ApiResponse.error<TokenModel>(
        500,
        message: '服务器响应格式错误',
      );
    }
  }
  
  /// Android原生登录API
  /// 
  /// [request] 原生登录请求参数（包含设备信息）
  /// 返回包含ApiUserInfoLogin的完整登录信息
  static Future<ApiUserInfoLogin> loginNative(LoginReqNative request) async {
    try {
      debugPrint('🔐 开始Android原生登录');
      debugPrint('📤 请求参数: ${request.toJson()}');
      
      // 🔥 关键修复：Android原生使用form-data格式，不是JSON
      // 使用DioService发送POST请求（form-data格式）
      final response = await _dioService.post(
        loginNativePath,
        data: request.toJson(),
        options: dio.Options(
          contentType: dio.Headers.formUrlEncodedContentType, // application/x-www-form-urlencoded
        ),
      );
      
      debugPrint('📥 登录响应状态: ${response.statusCode}');
      
      // 解析响应数据
      if (response.data != null && response.data is Map<String, dynamic>) {
        final responseData = response.data as Map<String, dynamic>;
        
        debugPrint('📥 响应数据结构: ${responseData.keys.toList()}');
        
        // 检查响应状态码
        final code = responseData['code']?.toInt() ?? 0;
        final msg = responseData['msg']?.toString() ?? '';
        
        debugPrint('📥 响应code: $code, msg: $msg');
        
        if (code == 1) {
          // 成功响应 - 解析data字段为ApiUserInfoLogin
          final data = responseData['data'] ?? responseData['retObj'];
          
          if (data != null && data is Map<String, dynamic>) {
            debugPrint('✅ 开始解析登录数据...');
            debugPrint('📊 登录数据内容: $data');
            
            final loginInfo = ApiUserInfoLogin.fromJson(data);
            
            debugPrint('✅ 登录成功！');
            debugPrint('👤 用户信息:');
            debugPrint('  - userId: ${loginInfo.userInfo.userId}');
            debugPrint('  - username: ${loginInfo.userInfo.username}');
            debugPrint('  - nickname: ${loginInfo.userInfo.nickname}');
            debugPrint('  - mobile: ${loginInfo.userInfo.mobile}');
            debugPrint('  - sex: ${loginInfo.userInfo.sex}');
            debugPrint('  - avatar: ${loginInfo.userInfo.avatar}');
            debugPrint('🔑 Token: ${loginInfo.userToken.substring(0, 20)}...');
            debugPrint('🎁 首次登录: ${loginInfo.isFirstLogin == 1}');
            debugPrint('💰 VIP状态: ${loginInfo.vipType == 1}');
            debugPrint('🎟️ 商城Token: ${loginInfo.s2b2cConsumerToken?.substring(0, 20) ?? "无"}');
            
            return loginInfo;
          } else {
            debugPrint('❌ 登录数据格式错误');
            throw Exception('登录数据格式错误');
          }
        } else {
          // 业务失败响应
          debugPrint('❌ 登录失败: $msg');
          
          // 特殊处理：token失效
          if (code == 44003) {
            debugPrint('🔐 检测到token失效');
            _handleTokenExpired();
          }
          
          throw Exception(msg.isNotEmpty ? msg : '登录失败');
        }
      } else {
        debugPrint('❌ 服务器响应格式错误');
        throw Exception('服务器响应格式错误');
      }
    } catch (e) {
      debugPrint('❌ 登录API异常: $e');
      rethrow;
    }
  }
  
  /// 获取短信验证码API
  /// 
  /// [request] 验证码请求参数
  /// 返回成功或失败结果
  static Future<bool> getSMSCode(SmsCodeReq request) async {
    try {
      debugPrint('📱 开始获取验证码');
      debugPrint('📤 请求参数: ${request.toJson()}');
      
      // 🔥 关键修复：Android原生使用form-data格式，不是JSON
      // 使用DioService发送POST请求（form-data格式）
      final response = await _dioService.post(
        getSMSCodePath,
        data: request.toJson(),
        options: dio.Options(
          contentType: dio.Headers.formUrlEncodedContentType, // application/x-www-form-urlencoded
        ),
      );
      
      debugPrint('📥 验证码响应状态: ${response.statusCode}');
      
      // 解析响应数据
      if (response.data != null && response.data is Map<String, dynamic>) {
        final responseData = response.data as Map<String, dynamic>;
        
        // 检查响应状态码
        final code = responseData['code']?.toInt() ?? 0;
        final msg = responseData['msg']?.toString() ?? '';
        
        debugPrint('📥 响应code: $code, msg: $msg');
        
        if (code == 1) {
          debugPrint('✅ 验证码发送成功');
          return true;
        } else {
          debugPrint('❌ 验证码发送失败: $msg');
          throw Exception(msg.isNotEmpty ? msg : '验证码发送失败');
        }
      } else {
        debugPrint('❌ 服务器响应格式错误');
        throw Exception('服务器响应格式错误');
      }
    } catch (e) {
      debugPrint('❌ 获取验证码API异常: $e');
      rethrow;
    }
  }
  
  /// 验证码登录API
  /// 
  /// [request] 验证码登录请求参数
  /// 返回包含ApiUserInfoLogin的完整登录信息
  static Future<ApiUserInfoLogin> phoneCodeLogin(PhoneCodeLoginReq request) async {
    try {
      debugPrint('🔐 开始验证码登录');
      debugPrint('📤 请求参数: ${request.toJson()}');
      
      // 🔥 关键修复：Android原生使用form-data格式，不是JSON
      // 使用DioService发送POST请求（form-data格式）
      final response = await _dioService.post(
        phoneCodeLoginPath,
        data: request.toJson(),
        options: dio.Options(
          contentType: dio.Headers.formUrlEncodedContentType, // application/x-www-form-urlencoded
        ),
      );
      
      debugPrint('📥 登录响应状态: ${response.statusCode}');
      
      // 解析响应数据
      if (response.data != null && response.data is Map<String, dynamic>) {
        final responseData = response.data as Map<String, dynamic>;
        
        debugPrint('📥 响应数据结构: ${responseData.keys.toList()}');
        
        // 检查响应状态码
        final code = responseData['code']?.toInt() ?? 0;
        final msg = responseData['msg']?.toString() ?? '';
        
        debugPrint('📥 响应code: $code, msg: $msg');
        
        if (code == 1) {
          // 成功响应 - 解析data字段为ApiUserInfoLogin
          final data = responseData['data'] ?? responseData['retObj'];
          
          if (data != null && data is Map<String, dynamic>) {
            debugPrint('✅ 开始解析登录数据...');
            
            final loginInfo = ApiUserInfoLogin.fromJson(data);
            
            debugPrint('✅ 验证码登录成功！');
            debugPrint('👤 用户信息:');
            debugPrint('  - userId: ${loginInfo.userInfo.userId}');
            debugPrint('  - username: ${loginInfo.userInfo.username}');
            debugPrint('  - nickname: ${loginInfo.userInfo.nickname}');
            debugPrint('  - mobile: ${loginInfo.userInfo.mobile}');
            debugPrint('🔑 Token: ${loginInfo.userToken.substring(0, min(20, loginInfo.userToken.length))}...');
            
            return loginInfo;
          } else {
            debugPrint('❌ 登录数据格式错误');
            throw Exception('登录数据格式错误');
          }
        } else {
          // 业务失败响应
          debugPrint('❌ 验证码登录失败: $msg');
          
          // 特殊处理：token失效
          if (code == 44003) {
            debugPrint('🔐 检测到token失效');
            _handleTokenExpired();
          }
          
          throw Exception(msg.isNotEmpty ? msg : '登录失败');
        }
      } else {
        debugPrint('❌ 服务器响应格式错误');
        throw Exception('服务器响应格式错误');
      }
    } catch (e) {
      debugPrint('❌ 验证码登录API异常: $e');
      rethrow;
    }
  }
  
  /// 刷新访问令牌API
  /// 
  /// [refreshToken] 刷新令牌
  /// 返回包含新TokenModel的ApiResponse
  static Future<ApiResponse<TokenModel>> refreshToken(String refreshToken) async {
    debugPrint('🔄 UserApi.refreshToken开始调用');
    debugPrint('🔄 刷新令牌长度: ${refreshToken.length}');
    
    // 构建刷新令牌请求参数
    final requestData = {
      'refreshToken': refreshToken,
    };
    
    debugPrint('🔄 准备发送刷新令牌请求到: $refreshTokenPath');
    
    try {
      // 使用DioService发送请求（DioService已配置了baseUrl）
      // 错误处理由DioService统一处理，不在此处重复处理
      final response = await _dioService.post(
        refreshTokenPath,
        data: requestData,
      );
      
      debugPrint('🔄 刷新令牌请求完成，状态码: ${response.statusCode}');
      
      // 解析响应数据
      if (response.data != null && response.data is Map<String, dynamic>) {
        final responseData = response.data as Map<String, dynamic>;
        
        debugPrint('🔄 刷新令牌响应数据: $responseData');
        
        // 使用ApiResponse.fromJson解析，并提供TokenModel的fromJson方法
        final apiResponse = ApiResponse<TokenModel>.fromJson(
          responseData,
          fromJsonT: TokenModel.fromJson,
        );
        
        debugPrint('🔄 ApiResponse解析完成，成功状态: ${apiResponse.isSuccess}');
        return apiResponse;
      } else {
        debugPrint('❌ 刷新令牌响应数据格式错误');
        return ApiResponse.error<TokenModel>(
          500,
          message: '服务器响应格式错误',
        );
      }
    } catch (e) {
      debugPrint('❌ UserApi.refreshToken异常: $e');
      rethrow;
    }
  }
  
  /// ⚠️ 已废弃 - 若依框架接口，Android原生项目不使用
  /// 
  /// Android原生项目已通过以下方式获取完整用户信息：
  /// 1. 登录时：loginNative() 返回 ApiUserInfoLogin（包含完整用户信息）
  /// 2. 我的页面：getMyHeadInfo() 返回 ApiUserInfoMyHead（包含统计数据）
  /// 
  /// @deprecated 请使用 getMyHeadInfo() 或从本地缓存获取用户信息
  /*
  static Future<UserProfileModel> getUserProfile() async {
    try {
      debugPrint('🔄 开始获取用户个人信息');
      
      final response = await _dioService.get(userProfilePath);
      
      if (response.data != null && response.data is Map<String, dynamic>) {
        final responseData = response.data as Map<String, dynamic>;
        
        final code = responseData['code']?.toInt() ?? 0;
        final msg = responseData['msg']?.toString();
        
        if (code == 200) {
          final data = responseData['data'];
          if (data != null && data is Map<String, dynamic>) {
            final userProfile = UserProfileModel.fromJson(data);
            debugPrint('✅ 获取用户个人信息成功: ${userProfile.nickName}');
            return userProfile;
          } else {
            debugPrint('❌ 用户个人信息数据格式错误');
            throw Exception('用户信息数据格式错误');
          }
        } else {
          debugPrint('❌ 获取用户个人信息失败: $msg');
          throw Exception(msg ?? '获取用户个人信息失败');
        }
      } else {
        debugPrint('❌ 服务器响应格式错误');
        throw Exception('服务器响应格式错误');
      }
    } catch (e) {
      debugPrint('❌ 获取用户个人信息异常: $e');
      rethrow;
    }
  }
  */
  
  /// ⚠️ 已废弃 - 若依框架接口，Android原生项目不使用
  /// 
  /// Android原生项目需要调用对应的原生API接口来更新用户信息
  /// @deprecated 等待Android原生API接口文档
  /*
  static Future<UserProfileModel> updateUserProfile(UpdateUserProfileReq request) async {
    try {
      debugPrint('🔄 开始修改用户个人信息: ${request.nickName}');
      
      // 使用DioService发送PUT请求
      final response = await _dioService.put(
        updateProfilePath,
        data: request.toJson(),
      );
      
      // 解析响应数据
      if (response.data != null && response.data is Map<String, dynamic>) {
        final responseData = response.data as Map<String, dynamic>;
        
        // 检查响应状态码
        final code = responseData['code']?.toInt() ?? 0;
        final msg = responseData['msg']?.toString();
        
        if (code == 200) {
          // 成功响应 - 解析data字段为UserProfileModel
          final data = responseData['data'];
          if (data != null && data is Map<String, dynamic>) {
            final userProfile = UserProfileModel.fromJson(data);
            
            debugPrint('✅ 修改用户信息成功: ${userProfile.nickName}');
            
            return userProfile;
          } else {
            debugPrint('❌ 用户信息数据格式错误');
            throw Exception('用户信息数据格式错误');
          }
        } else {
          // 业务失败响应
          debugPrint('❌ 修改用户信息失败: $msg');
          
          // 特殊处理：token失效
          if (code == 44003) {
            debugPrint('🔐 检测到token失效');
            _handleTokenExpired();
          }
          
          throw Exception(msg ?? '修改用户信息失败');
        }
      } else {
        debugPrint('❌ 服务器响应格式错误');
        throw Exception('服务器响应格式错误');
      }
    } catch (e) {
      debugPrint('❌ 修改用户信息异常: $e');
      rethrow;
    }
  }
  */
  
  /// ⚠️ 已废弃 - 若依框架接口，Android原生项目不使用
  /// 
  /// Android原生项目需要调用对应的原生API接口来上传头像
  /// @deprecated 等待Android原生API接口文档
  /*
  /// 上传用户头像API
  /// 
  /// [avatarFilePath] 头像文件路径
  /// 返回AvatarUploadResult包含上传结果
  static Future<AvatarUploadResult> uploadAvatar(String avatarFilePath) async {
    try {
      debugPrint('🔄 开始上传用户头像: $avatarFilePath');
      
      // 检查文件是否存在
      final file = File(avatarFilePath);
      if (!await file.exists()) {
        debugPrint('❌ 头像文件不存在');
        return AvatarUploadResult.failure('头像文件不存在');
      }
      
      // 创建FormData
      final formData = dio.FormData.fromMap({
        'avatarfile': await dio.MultipartFile.fromFile(
          avatarFilePath,
          filename: avatarFilePath.split('/').last,
        ),
      });
      
      debugPrint('🔄 发送头像上传请求');
      
      // 发送POST请求
      final response = await _dioService.post(
        uploadAvatarPath,
        data: formData,
        options: dio.Options(
          contentType: 'multipart/form-data',
        ),
      );
      
      // 解析响应数据
      if (response.data != null && response.data is Map<String, dynamic>) {
        final responseData = response.data as Map<String, dynamic>;
        
        // 检查响应状态码
        final code = responseData['code']?.toInt() ?? 0;
        final msg = responseData['msg']?.toString();
        
        if (code == 200) {
          // 成功响应 - 获取头像URL
          final imgUrl = responseData['imgUrl']?.toString();
          
          if (imgUrl != null && imgUrl.isNotEmpty) {
            debugPrint('✅ 头像上传成功: $imgUrl');
            return AvatarUploadResult.success(imgUrl);
          } else {
            debugPrint('❌ 头像上传响应中没有imgUrl');
            return AvatarUploadResult.failure('服务器响应异常');
          }
        } else {
          // 业务失败响应
          debugPrint('❌ 头像上传失败: $msg');
          
          // 特殊处理：token失效
          if (code == 44003) {
            debugPrint('🔐 检测到token失效');
            _handleTokenExpired();
          }
          
          return AvatarUploadResult.failure(msg ?? '上传头像失败');
        }
      } else {
        debugPrint('❌ 服务器响应格式错误');
        return AvatarUploadResult.failure('服务器响应格式错误');
      }
    } catch (e) {
      debugPrint('❌ 头像上传异常: $e');
      return AvatarUploadResult.failure('头像上传异常：${e.toString()}');
    }
  }
  */
  
  /// 获取我的页面头部信息
  /// 
  /// 对应Android原生的 /api/user/getMyHeadInfo
  /// 包含用户基本信息和统计数据（粉丝数、关注数、互关数、打赏数等）
  /// 
  /// [touid] 查看的用户ID，查看自己时传0
  /// 返回ApiUserInfoMyHead包含完整的我的页面数据
  static Future<ApiUserInfoMyHead> getMyHeadInfo({int touid = 0}) async {
    try {
      debugPrint('👤 开始获取我的页面头部信息');
      debugPrint('📤 请求参数: touid=$touid');
      
      // 使用form-data格式（对标Android原生）
      final response = await _dioService.post(
        getMyHeadInfoPath,
        data: {
          'touid': touid,  // 查看自己传0
        },
        options: dio.Options(
          contentType: dio.Headers.formUrlEncodedContentType,
        ),
      );
      
      debugPrint('📥 头部信息响应状态: ${response.statusCode}');
      
      // 解析响应数据
      if (response.data != null && response.data is Map<String, dynamic>) {
        final responseData = response.data as Map<String, dynamic>;
        final code = responseData['code']?.toInt() ?? 0;
        final msg = responseData['msg']?.toString() ?? '';
        
        debugPrint('📥 响应code: $code, msg: $msg');
        
        if (code == 1) {
          // 成功响应
          final data = responseData['data'] ?? responseData['retObj'];
          
          if (data != null && data is Map<String, dynamic>) {
            final headInfo = ApiUserInfoMyHead.fromJson(data);
            
            debugPrint('✅ 获取头部信息成功');
            debugPrint('👤 用户: ${headInfo.userInfo.nickname ?? headInfo.userInfo.username}');
            debugPrint('📊 统计数据:');
            debugPrint('  - 粉丝: ${headInfo.fansNum}');
            debugPrint('  - 关注: ${headInfo.followNum}');
            debugPrint('  - 互关: ${headInfo.mutualFollowNum}');
            debugPrint('  - 打赏: ${headInfo.giveMeRewardNum}');
            debugPrint('  - 点赞: ${headInfo.likeNum}');
            debugPrint('  - 收藏: ${headInfo.collectNum}');
            
            return headInfo;
          } else {
            debugPrint('❌ 头部信息数据格式错误');
            throw Exception('头部信息数据格式错误');
          }
        } else {
          // 业务失败响应
          debugPrint('❌ 获取头部信息失败: $msg');
          
          // 特殊处理：token失效
          if (code == 44003) {
            debugPrint('🔐 检测到token失效，跳转到登录页');
            _handleTokenExpired();
          }
          
          throw Exception(msg.isNotEmpty ? msg : '获取头部信息失败');
        }
      } else {
        debugPrint('❌ 服务器响应格式错误');
        throw Exception('服务器响应格式错误');
      }
    } catch (e) {
      debugPrint('❌ 获取头部信息API异常: $e');
      rethrow;
    }
  }
  
}
